home *** CD-ROM | disk | FTP | other *** search
/ Sprite 1984 - 1993 / Sprite 1984 - 1993.iso / src / lib / c / net / RCS / res_mkquery.c,v < prev    next >
Text File  |  1988-07-29  |  6KB  |  290 lines

  1. head     1.3;
  2. access   ;
  3. symbols  ;
  4. locks    ; strict;
  5. comment  @ * @;
  6.  
  7.  
  8. 1.3
  9. date     88.07.29.18.32.35;  author ouster;  state Exp;
  10. branches ;
  11. next     1.2;
  12.  
  13. 1.2
  14. date     88.07.29.16.59.57;  author ouster;  state Exp;
  15. branches ;
  16. next     1.1;
  17.  
  18. 1.1
  19. date     88.06.20.09.57.19;  author ouster;  state Exp;
  20. branches ;
  21. next     ;
  22.  
  23.  
  24. desc
  25. @@
  26.  
  27.  
  28. 1.3
  29. log
  30. @Lint.
  31. @
  32. text
  33. @/*
  34.  * Copyright (c) 1985 Regents of the University of California.
  35.  * All rights reserved.
  36.  *
  37.  * Redistribution and use in source and binary forms are permitted
  38.  * provided that this notice is preserved and that due credit is given
  39.  * to the University of California at Berkeley. The name of the University
  40.  * may not be used to endorse or promote products derived from this
  41.  * software without specific prior written permission. This software
  42.  * is provided ``as is'' without express or implied warranty.
  43.  */
  44.  
  45. #if defined(LIBC_SCCS) && !defined(lint)
  46. static char sccsid[] = "@@(#)res_mkquery.c    6.7 (Berkeley) 3/7/88";
  47. #endif /* LIBC_SCCS and not lint */
  48.  
  49. #include <stdio.h>
  50. #include <sys/types.h>
  51. #include <netinet/in.h>
  52. #include <arpa/nameser.h>
  53. #include <resolv.h>
  54.  
  55. /*
  56.  * Form all types of queries.
  57.  * Returns the size of the result or -1.
  58.  */
  59.     /* ARGSUSED */
  60. res_mkquery(op, dname, class, type, data, datalen, newrr, buf, buflen)
  61.     int op;            /* opcode of query */
  62.     char *dname;        /* domain name */
  63.     int class, type;    /* class and type of query */
  64.     char *data;        /* resource record data */
  65.     int datalen;        /* length of data */
  66.     struct rrec *newrr;    /* new rr for modify or append */
  67.     char *buf;        /* buffer to put query */
  68.     int buflen;        /* size of buffer */
  69. {
  70.     register HEADER *hp;
  71.     register char *cp;
  72.     register int n;
  73.     char dnbuf[MAXDNAME];
  74.     char *dnptrs[10], **dpp, **lastdnptr;
  75.     extern char *index();
  76.  
  77. #ifdef DEBUG
  78.     if (_res.options & RES_DEBUG)
  79.         printf("res_mkquery(%d, %s, %d, %d)\n", op, dname, class, type);
  80. #endif DEBUG
  81.     /*
  82.      * Initialize header fields.
  83.      */
  84.     hp = (HEADER *) buf;
  85.     hp->id = htons(++_res.id);
  86.     hp->opcode = op;
  87.     hp->qr = hp->aa = hp->tc = hp->ra = 0;
  88.     hp->pr = (_res.options & RES_PRIMARY) != 0;
  89.     hp->rd = (_res.options & RES_RECURSE) != 0;
  90.     hp->rcode = NOERROR;
  91.     hp->qdcount = 0;
  92.     hp->ancount = 0;
  93.     hp->nscount = 0;
  94.     hp->arcount = 0;
  95.     cp = buf + sizeof(HEADER);
  96.     buflen -= sizeof(HEADER);
  97.     dpp = dnptrs;
  98.     *dpp++ = buf;
  99.     *dpp++ = NULL;
  100.     lastdnptr = dnptrs + sizeof(dnptrs)/sizeof(dnptrs[0]);
  101.     /*
  102.      * If the domain name contains no dots (single label), then
  103.      * append the default domain name to the one given.
  104.      */
  105.     if ((_res.options & RES_DEFNAMES) && dname != 0 && dname[0] != '\0' &&
  106.         index(dname, '.') == NULL) {
  107.         if (!(_res.options & RES_INIT))
  108.             if (res_init() == -1)
  109.                 return(-1);
  110.         if (_res.defdname[0] != '\0') {
  111.             (void)sprintf(dnbuf, "%s.%s", dname, _res.defdname);
  112.             dname = dnbuf;
  113.         }
  114.     }
  115.     /*
  116.      * perform opcode specific processing
  117.      */
  118.     switch (op) {
  119.     case QUERY:
  120.         buflen -= QFIXEDSZ;
  121.         if ((n = dn_comp((u_char *) dname, (u_char *) cp, buflen,
  122.             (u_char **) dnptrs, (u_char **) lastdnptr)) < 0)
  123.             return (-1);
  124.         cp += n;
  125.         buflen -= n;
  126.         putshort((u_short) type, (u_char *) cp);
  127.         cp += sizeof(u_short);
  128.         putshort((u_short) class, (u_char *) cp);
  129.         cp += sizeof(u_short);
  130.         hp->qdcount = htons(1);
  131.         if (op == QUERY || data == NULL)
  132.             break;
  133.         /*
  134.          * Make an additional record for completion domain.
  135.          */
  136.         buflen -= RRFIXEDSZ;
  137.         if ((n = dn_comp((u_char *) data, (u_char *) cp, buflen,
  138.             (u_char **) dnptrs, (u_char **) lastdnptr)) < 0)
  139.             return (-1);
  140.         cp += n;
  141.         buflen -= n;
  142.         putshort(T_NULL, (u_char *) cp);
  143.         cp += sizeof(u_short);
  144.         putshort((u_short) class, (u_char *) cp);
  145.         cp += sizeof(u_short);
  146.         putlong((u_long) 0, (u_char *) cp);
  147.         cp += sizeof(u_long);
  148.         putshort((u_short) 0, (u_char *) cp);
  149.         cp += sizeof(u_short);
  150.         hp->arcount = htons(1);
  151.         break;
  152.  
  153.     case IQUERY:
  154.         /*
  155.          * Initialize answer section
  156.          */
  157.         if (buflen < 1 + RRFIXEDSZ + datalen)
  158.             return (-1);
  159.         *cp++ = '\0';    /* no domain name */
  160.         putshort((u_short) type, (u_char *) cp);
  161.         cp += sizeof(u_short);
  162.         putshort((u_short) class, (u_char *) cp);
  163.         cp += sizeof(u_short);
  164.         putlong((u_long) 0, (u_char *) cp);
  165.         cp += sizeof(u_long);
  166.         putshort((u_short) datalen, (u_char *) cp);
  167.         cp += sizeof(u_short);
  168.         if (datalen) {
  169.             bcopy(data, cp, datalen);
  170.             cp += datalen;
  171.         }
  172.         hp->ancount = htons(1);
  173.         break;
  174.  
  175. #ifdef ALLOW_UPDATES
  176.     /*
  177.      * For UPDATEM/UPDATEMA, do UPDATED/UPDATEDA followed by UPDATEA
  178.      * (Record to be modified is followed by its replacement in msg.)
  179.      */
  180.     case UPDATEM:
  181.     case UPDATEMA:
  182.  
  183.     case UPDATED:
  184.         /*
  185.          * The res code for UPDATED and UPDATEDA is the same; user
  186.          * calls them differently: specifies data for UPDATED; server
  187.          * ignores data if specified for UPDATEDA.
  188.          */
  189.     case UPDATEDA:
  190.         buflen -= RRFIXEDSZ + datalen;
  191.         if ((n = dn_comp(dname, cp, buflen, dnptrs, lastdnptr)) < 0)
  192.             return (-1);
  193.         cp += n;
  194.         putshort(type, cp);
  195.                 cp += sizeof(u_short);
  196.                 putshort(class, cp);
  197.                 cp += sizeof(u_short);
  198.         putlong(0, cp);
  199.         cp += sizeof(u_long);
  200.         putshort(datalen, cp);
  201.                 cp += sizeof(u_short);
  202.         if (datalen) {
  203.             bcopy(data, cp, datalen);
  204.             cp += datalen;
  205.         }
  206.         if ( (op == UPDATED) || (op == UPDATEDA) ) {
  207.             hp->ancount = htons(0);
  208.             break;
  209.         }
  210.         /* Else UPDATEM/UPDATEMA, so drop into code for UPDATEA */
  211.  
  212.     case UPDATEA:    /* Add new resource record */
  213.         buflen -= RRFIXEDSZ + datalen;
  214.         if ((n = dn_comp(dname, cp, buflen, dnptrs, lastdnptr)) < 0)
  215.             return (-1);
  216.         cp += n;
  217.         putshort(newrr->r_type, cp);
  218.                 cp += sizeof(u_short);
  219.                 putshort(newrr->r_class, cp);
  220.                 cp += sizeof(u_short);
  221.         putlong(0, cp);
  222.         cp += sizeof(u_long);
  223.         putshort(newrr->r_size, cp);
  224.                 cp += sizeof(u_short);
  225.         if (newrr->r_size) {
  226.             bcopy(newrr->r_data, cp, newrr->r_size);
  227.             cp += newrr->r_size;
  228.         }
  229.         hp->ancount = htons(0);
  230.         break;
  231.  
  232. #endif ALLOW_UPDATES
  233.     }
  234.     return (cp - buf);
  235. }
  236. @
  237.  
  238.  
  239. 1.2
  240. log
  241. @Lint.
  242. @
  243. text
  244. @d134 1
  245. a134 1
  246.         putshort(datalen, cp);
  247. @
  248.  
  249.  
  250. 1.1
  251. log
  252. @Initial revision
  253. @
  254. text
  255. @d27 1
  256. d89 2
  257. a90 1
  258.         if ((n = dn_comp(dname, cp, buflen, dnptrs, lastdnptr)) < 0)
  259. d94 1
  260. a94 1
  261.         putshort(type, cp);
  262. d96 1
  263. a96 1
  264.         putshort(class, cp);
  265. d105 2
  266. a106 1
  267.         if ((n = dn_comp(data, cp, buflen, dnptrs, lastdnptr)) < 0)
  268. d110 1
  269. a110 1
  270.         putshort(T_NULL, cp);
  271. d112 1
  272. a112 1
  273.         putshort(class, cp);
  274. d114 1
  275. a114 1
  276.         putlong(0, cp);
  277. d116 1
  278. a116 1
  279.         putshort(0, cp);
  280. d128 1
  281. a128 1
  282.         putshort(type, cp);
  283. d130 1
  284. a130 1
  285.         putshort(class, cp);
  286. d132 1
  287. a132 1
  288.         putlong(0, cp);
  289. @
  290.